var okky = undefined
var askeleen_pituus = 5
var siirtojen_tiheys_millisekunteina = 30
var pahikset = []
var pahiksen_vuoronumero = 0
var pahisten_suunnanvaihto_skaala = 10
var pause = false
var sokkelo = []
var sokkelon_ruudun_leveys = 50
var sokkelon_ruudun_korkeus = 25
var tilaa_ylla = 50
var pisteet = 0
var kerattavaa = 0
var tsup_aani = new Audio("äänet/tsup.mp3")
var klak_aani = new Audio("äänet/klak.mp3")
var musa = new Audio("äänet/bäbäbäbäm-bämbäm.mp3")

function pelin_alku() {
  musa.play()
  pisteet = 0
  malli = document.getElementById("sininen")
  tee_sokkelo(malli, 15, 20)

  okky = document.getElementById("ökky")
  okky.style.top = tilaa_ylla + sokkelon_ruudun_korkeus * 7
  okky.style.left = sokkelon_ruudun_leveys * 7
  okky.visibility = "visible"

  pahikset = document.getElementsByClassName("pahis")
  for(var i = pahikset.length; i-- > 0;) {
    alusta_pahis(i)
  }

  okky.esine_kohdalla = esine_otuksen_kohdalla(okky)
  okky.nopeus = askeleen_pituus

  setInterval(pelin_siirto, siirtojen_tiheys_millisekunteina)
}

function tee_sokkelo(malli, leveys, korkeus) {
  sokkelo = []
  kerattavaa = 0
  var kolikot = Array.prototype.slice.call(document.getElementsByClassName("kolikko"))
  for (y = 0; y < korkeus; y++) {
    sokkelo[y] = []
    for (x = 0; x < leveys; x++) {
      reuna = x == 0 || y == 0 || x+1 == leveys || y+1 == korkeus
      if (reuna) {
        sokkelo[y][x] = aseta_aita(malli, x, y)
      } else if (kolikot.length &&
          kolikot.length > (kolikon_numero = Math.floor(Math.random() * 2 * (korkeus - y) * (korkeus - y)))
        ) {
          kolikko = kolikot.splice(kolikon_numero, 1)[0]
          sokkelo[y][x] = aseta_kolikko(kolikko, x, y)
          ++kerattavaa
      } else if ( (x%2 == 0 || y%2==0) && Math.random() > 0.8 ) {
        sokkelo[y][x] = aseta_aita(malli, x, y)
      } else {
          sokkelo[y][x] = false
      }
    }
  }
}

function aseta_kolikko(kolikko, x, y) {
  kolikko.style.left = (
    sokkelon_ruudun_leveys * x +
    Math.floor((sokkelon_ruudun_leveys - kolikko.offsetWidth) / 2)
  )
  var y = (
    tilaa_ylla +
    sokkelon_ruudun_korkeus * y +
    Math.floor((sokkelon_ruudun_korkeus - kolikko.offsetHeight) / 2)
  )
  kolikko.style.top = y
  kolikko.style.zIndex = y + Math.floor(kolikko.offsetHeight / 2)
  kolikko.style.visibility = "visible"
  return kolikko
}

function aseta_aita(malli,x,y) {
  aita = new Image()
  aita.src = malli.src
  aita.className = malli.className
  aita.style.left = malli.offsetWidth * x
  var y = tilaa_ylla + malli.offsetHeight * y
  aita.style.top = y
  aita.style.zIndex = y + malli.offsetHeight
  aita.style.visibility = "visible"
  aita.este = true
  malli.parentElement.appendChild(aita)
  return aita
}

function alusta_pahis(i) {
  var pahis = pahikset[i]
  pahis.style.left = (i + 2) * 2 * sokkelon_ruudun_leveys
  pahis.style.top = tilaa_ylla + 2 * sokkelon_ruudun_korkeus
  pahis.nopeus = ("nopsa" === pahis.id ? 8 : 4)
  pahis.suunnanvaihto = 1 + i
  pahis.dx = 0
  pahis.dy = 0
}

window.onkeydown = function (painallus) {
  var nappulan_numero = painallus.which || window.event.keyCode
  if (nappulan_numero == 37) painettu_nuoli_vasemmalle()
  else if (nappulan_numero == 38) painettu_nuoli_ylos()
  else if (nappulan_numero == 39) painettu_nuoli_oikealle()
  else if (nappulan_numero == 40) painettu_nuoli_alas()
  else if (nappulan_numero == 27) vaihda_pause_tila()
  else console.log("Tuntematon nappula " + nappulan_numero)
}

window.onkeyup = function (painallus) {
  var nappulan_numero = painallus.which || window.event.keyCode
  if (nappulan_numero == 37 || nappulan_numero == 39) nostettu_sivusuuntainen_nuoli()
  else if (nappulan_numero == 38 || nappulan_numero == 40) nostettu_pystysuuntainen_nuoli()
  else okky.dx = okky.dy = 0
}

function vaihda_pause_tila() {
  pause = ! pause
}

function painettu_nuoli_vasemmalle () {
  okky.dx = -1
}

function painettu_nuoli_ylos () {
  okky.dy = -1
}

function painettu_nuoli_oikealle () {
  okky.dx = 1
}

function painettu_nuoli_alas () {
  okky.dy = 1
}

function nostettu_sivusuuntainen_nuoli() {
  okky.dx = 0
}

function nostettu_pystysuuntainen_nuoli() {
  okky.dy = 0
}

function pelin_siirto() {
  if (pause) return
  liikuta_sankaria()

  if (--pahiksen_vuoronumero < 0) pahiksen_vuoronumero = pahikset.length - 1
  liikuta_pahista(pahikset[pahiksen_vuoronumero])
}

var askel_laskuri = 1
function liikuta_sankaria() {
  if (okky.dx || okky.dy) {
    if (! --askel_laskuri) {
      soita("klak")
      askel_laskuri = 10
    }
  } else {
    askel_laskuri = 1
  }
  liikuta_otusta(okky)
  laske_otuksen_keskipiste(okky) // pahisten osumistarkistusta varten

  if (okky.esine_kohdalla && !okky.esine_kohdalla.este) {
    poista_esine_sokkelosta(okky)

    keratyt_esineet = document.getElementById("keratyt_esineet")
    keratyt_esineet.innerHTML = ++pisteet

    if (--kerattavaa < 1) {
      lopeta_peli("VOITIT!")
    } else {
      soita("tsup")
    }
  }
}

function poista_esine_sokkelosta(otus) {
  paikka = otuksen_sijainti_sokkelossa(otus)
  esine = sokkelo[paikka[1]][paikka[0]]
  if (esine && esine.style) {
    esine.style.visibility = "hidden"
  }
  otus.esine_kohdalla = sokkelo[paikka[1]][paikka[0]] = false
}

function liikuta_pahista(pahis) {
  if (Math.random()*pahisten_suunnanvaihto_skaala < pahis.suunnanvaihto) {
    vaihda_pahiksen_suuntaa(pahis)
  }
  liikuta_otusta(pahis)
  if (osuuko_pahis_sankariin(pahis)) {
    lopeta_peli("HÄVISIT!")
  }
}

function liikuta_otusta(otus) {
  liikauta_otusta(otus)

  esine_kohdalla = esine_otuksen_kohdalla(otus)
  if (esine_kohdalla && esine_kohdalla.este) {
    if (! otus.esine_kohdalla) {
      otus.esine_kohdalla = esine_kohdalla
      otus.dx = -otus.dx
      otus.dy = -otus.dy
      liikuta_otusta(otus)
      otus.dx = otus.dy = 0
      return
    }
  }
  otus.esine_kohdalla = esine_kohdalla
}

function liikauta_otusta(otus) {
  var x = otus.offsetLeft + otus.nopeus * otus.dx
  var y = otus.offsetTop + otus.nopeus * otus.dy
  console.log(x,y)
  otus.style.left = otus.offsetLeft + otus.nopeus * otus.dx
  otus.style.top = otus.offsetTop + otus.nopeus * otus.dy
  otus.style.zIndex = otus.offsetTop + otus.offsetHeight
}

function osuuko_pahis_sankariin(pahis) {
  return (
    (okky.vasemmalta_keskipisteeseen > pahis.offsetLeft) &&
    (okky.vasemmalta_keskipisteeseen < (pahis.offsetLeft + pahis.offsetWidth)) &&
    (okky.ylhaalta_keskipisteeseen > pahis.offsetTop) &&
    (okky.ylhaalta_keskipisteeseen < (pahis.offsetTop + pahis.offsetHeight))
  )
}

function lopeta_peli(viesti) {
  musa.play()
  alert("PELI LOPPUI: " + viesti)
  window.location = window.location
}

function vaihda_pahiksen_suuntaa(pahis) {
    vaaka_ero = okky.offsetLeft - pahis.offsetLeft
    pysty_ero = okky.offsetTop - pahis.offsetTop
    if (Math.abs(vaaka_ero) > Math.abs(pysty_ero)) {
      pahis.dx =  vaaka_ero > 0 ? 1 : -1
      pahis.dy = 0
    } else {
      pahis.dy = pysty_ero > 0 ? 1 : -1
      pahis.dx = 0
    }
}

function laske_otuksen_keskipiste(otus) {
  otus.vasemmalta_keskipisteeseen = otus.offsetLeft + Math.floor(otus.offsetWidth / 2)
  otus.ylhaalta_keskipisteeseen = otus.offsetTop + Math.floor(otus.offsetHeight / 2)
}

function osuuko_otus_aitaan(otus) {
  esine = esine_otuksen_kohdalla(otus)
  return esine && esine.este
}

function esine_otuksen_kohdalla(otus) {
  var paikka = otuksen_sijainti_sokkelossa(otus)
  return sokkelo[paikka[1]][paikka[0]]
}

function otuksen_sijainti_sokkelossa(otus) {
  var sokkelon_rivi = Math.floor(
    (otus.offsetTop + otus.offsetHeight - Math.floor(sokkelon_ruudun_korkeus/2) - tilaa_ylla) /
    sokkelon_ruudun_korkeus
  )
  var sokkelon_sarake = Math.floor(
    (otus.offsetLeft + Math.floor(otus.offsetWidth / 2)) / sokkelon_ruudun_leveys
  )
  return [sokkelon_sarake, sokkelon_rivi]
}

function soita(aani) {
  var raita = new Audio("äänet/" + aani + ".mp3")
  raita.play()
}

